home *** CD-ROM | disk | FTP | other *** search
/ LOGIC Apps / Logic-APPLE_II_APPS.iso / mac / LOGIC Apple II 5.25" Library - ProDOS / PRO102.dsk / COMPRESSOR / COMPRESSOR.S.txt < prev   
Text File  |  2012-02-16  |  49KB  |  1,660 lines

  1. ********************************
  2. *                              *
  3. *          Compressor          *
  4. *                              *
  5. *        By Karl Bunker        *
  6. *                              *
  7. ********************************
  8.          KEEP  COMPRESSOR
  9.          ORG   $803
  10.          MCOPY /HD/ORCA/MACROS/MACROS.8.BIT
  11. MAIN     START
  12.          65816 OFF
  13.          65C02 OFF
  14.          MSB   ON
  15.          JMP   BEGIN
  16.  
  17. *===============================
  18. *            Labels
  19. *===============================
  20. HIMEM    EQU   $73
  21. COUT     EQU   $FDED
  22. COUT1    EQU   $FDF0
  23. CROUT    EQU   $FD8E      Return print
  24. PRBYTE   EQU   $FDDA
  25. VTB      EQU   $FC22
  26. PTR      EQU   $06        "Primary" pointers
  27. AUX_PTR  EQU   $08        "Auxiliary" pointers
  28. SCRTCH   EQU   $D64B      Execute Applesoft "NEW"
  29. CLEAR    EQU   $D66C      Applesoft "CLEAR" stack
  30. KEYBD    EQU   $C000
  31. STROBE   EQU   $C010
  32. GETLN    EQU   $FD6F      Input line
  33. RDKEY    EQU   $FD0C      Read key
  34. INBUF    EQU   $200
  35. MONHOME  EQU   $FC58
  36. PRBL2    EQU   $F94A
  37. CLREOF   EQU   $FC42      Clear to bottom page
  38. DOSCMD   EQU   $BE03      Basic.System command interpreter
  39. UP       EQU   $FC1A      Cursor up 1 line
  40. MLI      EQU   $BF00
  41. BELL     EQU   $FBDD
  42. ESC      EQU   $9B
  43. TXT      EQU   $04
  44. AWP      EQU   $1A
  45. COM      EQU   $F8
  46.  
  47. *=======================================
  48. *  Subroutines for file openning, etc.
  49. *=======================================
  50. *---------------------------------------
  51. *    Increment pointers subroutines
  52. *---------------------------------------
  53. INC_PTR  INC   PTR        Inc primary pointers
  54.          BNE   INCP_DN
  55.          INC   PTR+1
  56. INCP_DN  RTS
  57.  
  58. INC_APTR INC   AUX_PTR    Inc auxiliary pointers
  59.          BNE   INCA_DN
  60.          INC   AUX_PTR+1
  61. INCA_DN  RTS
  62. *-------------------------------
  63. *            Print
  64. *-------------------------------
  65. PRINT    PLA
  66.          STA   AUX_PTR
  67.          PLA
  68.          STA   AUX_PTR+1
  69.          LDY   #0
  70. PRNT_LUP JSR   INC_APTR
  71.          LDA   (AUX_PTR),Y
  72.          BEQ   PR_FNSH
  73.          JSR   COUT
  74.          JMP   PRNT_LUP
  75.  
  76. PR_FNSH  LDA   AUX_PTR+1
  77.          PHA
  78.          LDA   AUX_PTR
  79.          PHA
  80.          RTS
  81. *-------------------------------
  82. *             HOME
  83. *-------------------------------
  84. HOME     LDA   #$8C
  85.          JMP   COUT
  86. *-------------------------------
  87. *        VTAB routine
  88. *-------------------------------
  89. VTAB_RTN STA   $25
  90.          JMP   VTB
  91. *-------------------------------
  92. *     Clear screen bottom
  93. *-------------------------------
  94. CLR_BTM  LDA   #$8B
  95.          JMP   COUT
  96. *-------------------------------
  97. *         Input line
  98. *-------------------------------
  99. KEYPRESS ANOP
  100.          POKE  READ_1,$FF
  101.          BNE   GET_CHR    (always)
  102. INPUT    ANOP
  103.          LDX   #0
  104.          STX   READ_1
  105. GET_CHR  BIT   IIPLS      If II+ (Videoterm), use
  106.          BPL   GET_CHR2   keyboard-read, rather than
  107.          LDA   KEYBD      RDKEY.
  108.          BPL   GET_CHR
  109.          STA   STROBE
  110.          BMI   CHR_GOT
  111. GET_CHR2 JSR   RDKEY
  112. CHR_GOT  BIT   READ_1     If read-1-keypress flag set,
  113.          BPL   CHR_GOT2   return now.
  114.          RTS
  115. CHR_GOT2 CMP   #ESC       Esc?
  116.          BNE   NOT_ESC
  117. INP_QUIT RTS              If so, return with it
  118. NOT_ESC  CMP   #$8D       Return?
  119.          BEQ   INP_DUN
  120.          CMP   #$88       Left arrow?
  121.          BEQ   BK_SPC
  122.          CMP   #$FF       Delete?
  123.          BEQ   BK_SPC
  124.          CMP   #$95       Right arrow?
  125.          BEQ   FWD_SPC
  126.          CMP   INP_MINC   Other control char.?
  127.          BCC   GET_CHR
  128.          CPX   #48        Max. input length=48
  129.          BCS   GET_CHR
  130.          INX              Regular character
  131.          CMP   #'a'       If lower case, convert
  132.          BCC   STO_CHR
  133.          AND   #$DF
  134. STO_CHR  STA   INP_BUF,X
  135.          STX   INP_BUF
  136.          BNE   PRNT_CHR
  137.  
  138. BK_SPC   LDA   #$88       If <delete> force left-arrow
  139.          CPX   #1
  140.          BCC   GET_CHR
  141.          DEX
  142.          JMP   PRNT_CHR
  143. FWD_SPC  CPX   #48
  144.          BCS   GET_CHR
  145.          INX
  146.          STX   INP_BUF
  147.          INC   1403
  148.          BNE   GET_CHR
  149.  
  150. PRNT_CHR JSR   COUT
  151.          JMP   GET_CHR
  152. INP_DUN  STX   INP_BUF
  153.          CPX   #0
  154.          BEQ   INP_OUT2
  155. INP_OUT  LDA   #$9D       Return, clear rest of line
  156.          JSR   COUT
  157. INP_OUT2 JMP   CROUT      If return alone, don't erase
  158.  
  159. *-------------------------------
  160. *        Get_File_Info
  161. *-------------------------------
  162. G_F_I    LDA   #$A        Set up parm list for GFI
  163.          STA   PARMLST
  164.          LDA   #<INP_BUF  Low byte pathname address
  165.          STA   PARMLST+1
  166.          LDA   #>INP_BUF  High byte pathname address
  167.          STA   PARMLST+2
  168.  
  169.          JSR   MLI
  170.          DC    H'C4'      Code for Get_file_info
  171.          DC    A'PARMLST'
  172.  
  173.          RTS              Bring any error back
  174. *-------------------------------
  175. *        Print file type
  176. *-------------------------------
  177. PRNT_TYP ANOP
  178.          TAB80 1
  179.          LDA   FILE_TYP
  180.          CMP   #TXT
  181.          BEQ   PRNT_TXT
  182.          CMP   #COM
  183.          BEQ   PRNT_COM
  184.          JSR   PRINT
  185.          DC    C'- AppleWorks word processor file; '
  186.          DC    H'00'
  187.          JMP   PRTP_DN
  188. PRNT_COM JSR   PRINT
  189.          DC    C'- Compressed file; ',H'00'
  190.          JMP   PRTP_DN
  191. PRNT_TXT JSR   PRINT
  192.          DC    C'- ASCII text file; ',H'00'
  193.  
  194. PRTP_DN  ANOP             Fall through . . .
  195. *-------------------------------
  196. *    Print number of blocks
  197. *-------------------------------
  198.          POKE  LDNG_DGT,0 Init leading digit flag
  199.          LDX   #3
  200. PR_DGTLP LDY   #'0'
  201. INC_DGT  LDA   PARMLST+8  Low byte, blocks used
  202.          CMP   PRS_TENL,X Two-byte compare/subtract of
  203.          LDA   PARMLST+9  blocks used with power of 10
  204.          SBC   PRS_TENH,X
  205.          BCC   PR_DIGIT   Remainder < power of 10
  206.          STA   PARMLST+9  Store hi-byte remainder
  207.          LDA   PARMLST+8
  208.          SBC   PRS_TENL,X Get & store lo-byte remainder
  209.          STA   PARMLST+8
  210.          INY              Inc ASCII digit
  211.          BNE   INC_DGT
  212.  
  213. PR_DIGIT TYA
  214.          CMP   #'0'
  215.          BNE   PR_DGT2
  216.          BIT   LDNG_DGT   Is this "0" a leading "0"?
  217.          BPL   TO_DGTLP   If so, don't print it
  218. PR_DGT2  STA   LDNG_DGT   Set "leading 0" flag
  219.          JSR   COUT
  220. TO_DGTLP DEX              Dec X for next power of ten
  221.          BPL   PR_DGTLP   Until 4 #'s printed/skipped
  222.  
  223.          LDA   PARMLST+8
  224.          ORA   #'0'       Convert remainder to ASCII
  225.          JSR   COUT
  226.          JSR   PRINT
  227.          DC    C' blocks -',H'00'
  228.          RTS
  229.  
  230. PRS_TENH DC    I1>'10,100,1000,10000'
  231. PRS_TENL DC    I1<'10,100,1000,10000'
  232.  
  233. *-------------------------------
  234. *       Open source file
  235. *-------------------------------
  236. OPEN_SRC ANOP
  237.          LDA   #<SRC_NAM
  238.          STA   OPEN_PL+1
  239.          LDA   #>SRC_NAM
  240.          STA   OPEN_PL+2
  241.          JSR   MLI
  242.          DC    H'C8'      Code for Open
  243.          DC    A'OPEN_PL'
  244.  
  245.          RTS              Bring any error back
  246. *-------------------------------
  247. *       Open object file
  248. *-------------------------------
  249. OPEN_OBJ ANOP
  250.          LDA   #<INP_BUF
  251.          STA   OPEN_PL+1
  252.          LDA   #>INP_BUF
  253.          STA   OPEN_PL+2
  254.          JSR   MLI
  255.          DC    H'C8'      Code for open
  256.          DC    A'OPEN_PL'
  257.  
  258.          RTS              Bring any error back
  259.  
  260. *-------------------------------
  261. *      Get_mark subroutine
  262. *-------------------------------
  263. GET_MARK JSR   MLI
  264.          DC    H'CF'      Code for get_mark
  265.          DC    A'MARK_PL'
  266.  
  267.          BEQ   GTMK_OK
  268.          JMP   ERR_HAND
  269. GTMK_OK  RTS              Return
  270. *-------------------------------
  271. *      Set_Mark subroutine
  272. *-------------------------------
  273. SET_MARK JSR   MLI
  274.          DC    H'CE'      Code for set_mark
  275.          DC    A'MARK_PL'
  276.  
  277.          BEQ   SET_OK     No error
  278.          JMP   ERR_HAND
  279. SET_OK   RTS
  280. *-------------------------------
  281. *    Read for segmented reads
  282. *-------------------------------
  283. SEG_READ ANOP
  284.          JSR   GET_MARK   Get & save object file mark
  285.          LDA   MARK_PL+2
  286.          STA   OBJ_MARK
  287.          LDA   MARK_PL+3
  288.          STA   OBJ_MARK+1
  289.          LDA   MARK_PL+4
  290.          STA   OBJ_MARK+2
  291.          JSR   CLOSE      Then close it
  292.          LDA   YES_SWAP   Are we doing swaps?
  293.          BNE   SWAPS      If so, prompt before opening
  294.  
  295.          JSR   OPEN_SRC   Try to open source
  296.          BEQ   NO_SWAP    No error; both disks on-line
  297.          CMP   #$45
  298.          BEQ   SWAPS      Vol. not found; disk swapped
  299.          JMP   ERR_HAND   Other error
  300.  
  301. NO_SWAP  POKE  NO_SWAPS,1
  302.          JMP   ROPN_OK    Source open; go set mark
  303.  
  304. SWAPS    ANOP
  305.          POKE  YES_SWAP,1
  306.          JSR   CLR_BTM
  307.          VTAB  20
  308.          TAB80 1
  309.          JSR   PRINT
  310.          DC    C'Insert source disk, press <return> '
  311.          DC    H'00'
  312.          JSR   KEYPRESS
  313.          CMP   #$8D
  314.          BEQ   ROPN_SRC
  315.          CMP   #ESC
  316.          BNE   SWAPS
  317.          JMP   INIT       <esc> pressed; start over
  318.  
  319. ROPN_SRC JSR   UP
  320.          JSR   CLR_BTM    Clear screen bottom
  321.          JSR   OPEN_SRC   Try to open source again
  322.          BEQ   ROPN_OK
  323.          CMP   #$45
  324.          BEQ   SWAPS      Vol. not found; re-prompt
  325.          JMP   ERR_HAND
  326.  
  327. ROPN_OK  LDA   SRC_MARK
  328.          STA   MARK_PL+2
  329.          LDA   SRC_MARK+1
  330.          STA   MARK_PL+3
  331.          LDA   SRC_MARK+2
  332.          STA   MARK_PL+4
  333.          JSR   SET_MARK
  334.          JSR   RD_FILE
  335.  
  336.          LDA   NO_SWAPS   If we got here from NO_SWAP,
  337.          BNE   ROP_OBJ2   skip next prompt.
  338. SWAPS2   VTAB  20
  339.          TAB80 1
  340.          JSR   PRINT
  341.          DC    C'Insert object disk, press <return> '
  342.          DC    H'00'
  343.          JSR   KEYPRESS
  344.          CMP   #$8D
  345.          BEQ   ROPN_OBJ
  346.          CMP   #ESC
  347.          BNE   SWAPS2
  348.          JMP   INIT       <esc> pressed; start over
  349.  
  350. ROPN_OBJ JSR   UP
  351.          JSR   CLR_BTM    Clear screen bottom
  352. ROP_OBJ2 JSR   OPEN_OBJ   Try to open object
  353.          BEQ   ROPNO_OK
  354.          CMP   #$45
  355.          BEQ   SWAPS2     Vol. not found; re-prompt
  356.          JMP   ERR_HAND   Other error
  357.  
  358. ROPNO_OK LDA   OBJ_MARK
  359.          STA   MARK_PL+2
  360.          LDA   OBJ_MARK+1
  361.          STA   MARK_PL+3
  362.          LDA   OBJ_MARK+2
  363.          STA   MARK_PL+4   Reset object file mark, and
  364.          JMP   SET_MARK    return.
  365.  
  366. *-------------------------------
  367. *  Read file into main buffer
  368. *-------------------------------
  369. RD_FILE  ANOP
  370.          JSR   MLI
  371.          DC    H'CA'      Code for Read
  372.          DC    A'READ_PL'
  373.  
  374.          BEQ   READ_OK    No error
  375.          JMP   ERR_HAND
  376.  
  377. READ_OK  ANOP
  378. *---------------------------------------
  379. * Compare request_count to trans_count
  380. *---------------------------------------
  381. COMPARE  ANOP
  382.          LDA   READ_PL+6  Save TRANS_COUNT for DECOMP
  383.          STA   READ_IN
  384.          LDA   READ_PL+7
  385.          STA   READ_IN+1
  386.  
  387.          LDA   READ_PL+7  High byte trans_count
  388.          CMP   READ_PL+5  High byte request_count
  389.          BCC   SMALLER
  390.          LDA   READ_PL+6  Low bytes; if all bytes equal
  391.          CMP   READ_PL+4  then file (probably) bigger
  392.          BCC   SMALLER    than buffer.
  393.          LDA   #1         Trans = requ., so there must
  394. *                         be more text 'ahead' of buf.
  395.          BNE   CMPDONE    (always)
  396. SMALLER  LDA   #0         Trans<requ; file smaller
  397. CMPDONE  STA   MR_AHED    Set flags; more ahead
  398.          ORA   SEGMENTS   and SEGMENTS (SEGMENTS stays
  399.          STA   SEGMENTS   set after MR_AHED is 0)
  400.  
  401.          JSR   GET_MARK   Get and save source mark
  402.          LDA   MARK_PL+2
  403.          STA   SRC_MARK
  404.          LDA   MARK_PL+3
  405.          STA   SRC_MARK+1
  406.          LDA   MARK_PL+4
  407.          STA   SRC_MARK+2
  408.          JSR   CLOSE
  409. *-------------------------------
  410. *   Poke zero at end of text,
  411. *   check if AWP_CON needed
  412. *-------------------------------
  413.          CLC
  414.          LDA   READ_PL+6  Low byte trans_count
  415.          ADC   #<MAINBUF  Low byte address of main buf
  416.          STA   PTR
  417.          LDA   READ_PL+7  High byte trans_count
  418.          ADC   #>MAINBUF  High byte buffer address
  419.          STA   PTR+1
  420.          LDY   #0         One past end of text
  421.          TYA
  422.          STA    (PTR),Y
  423.  
  424.          LDA   #<MAINBUF  Set pointers to main buffer
  425.          STA   PTR
  426.          LDA   #>MAINBUF
  427.          STA   PTR+1
  428.  
  429.          LDA   FILE_TYP   If file is AWP, go convert
  430.          CMP   #AWP
  431.          BNE   RD_DONE
  432.          JSR   AWP_CON
  433.  
  434. RD_DONE  RTS
  435.  
  436. *-------------------------------
  437. *  Unlock, destroy object file
  438. *-------------------------------
  439. UNL_DES  ANOP
  440.          JSR   G_F_I      Do a Get_File_Info
  441.          LDA   #7         Re-set up parm list for SFI
  442.          STA   PARMLST
  443.          LDA   #$C3       Set access to "unlocked"
  444.          STA   PARMLST+3
  445.  
  446.          JSR   MLI
  447.          DC    H'C3'      Code for Set_File_Info
  448.          DC    A'PARMLST' Errors will be caught below
  449.  
  450. DESTROY  JSR   MLI
  451.          DC    H'C1'      Code for Destroy
  452.          DC    A'DEST_PL'
  453.  
  454.          BEQ   DESTROYD   No error
  455.          CMP   #$46       File not there to be
  456.          BEQ   DESTROYD   destroyed? That's ok; cont.
  457.          CMP   #$45
  458.          BEQ   DESTROYD
  459.          JMP   ERR_HAND
  460. DESTROYD RTS
  461.  
  462. *-------------------------------
  463. *  Error handler for Src & Obj
  464. *-------------------------------
  465. ERR_HAND ANOP
  466.          STA   STORE
  467.          JSR   CLEAR      Clean up stack
  468.          TAB80 1
  469.          JSR   CLR_BTM
  470.          LDA   STORE
  471.          CMP   #$44       Any of the
  472.          BCC   BAD_PTH    Path not found errors?
  473.          CMP   #$47
  474.          BCS   BAD_PTH
  475.          JSR   PRINT
  476.          DC    C'Can''t find ',H'00'
  477.          LDA   STORE
  478.          CMP   #$44
  479.          BNE   VOL_ERR
  480.          JSR   PRINT
  481.          DC    C'that directory.',H'00'
  482.          JMP   TRY_AGN
  483. VOL_ERR  CMP   #$45
  484.          BNE   FIL_ERR
  485.          JSR   PRINT
  486.          DC    C'that volume.',H'00'
  487.          JMP   TRY_AGN
  488. FIL_ERR  JSR   PRINT
  489.          DC    C'the source file.',H'00'
  490.          JMP   TRY_AGN
  491.  
  492. BAD_PTH  CMP   #$40       Bad pathname
  493.          BNE   WRT_PRTC
  494.          JSR   PRINT
  495.          DC    C'Invalid pathname.',H'00'
  496.          JMP   TRY_AGN
  497.  
  498. WRT_PRTC CMP   #$2B
  499.          BNE   VOL_FULL
  500.          JSR   PRINT
  501.          DC    C'Disk is write-protected.'
  502.          DC    H'00'
  503.          JMP   TRY_AGN
  504.  
  505. VOL_FULL CMP   #$48       Volume full error?
  506.          BNE   OTHR_ERR
  507.          JSR   CLOSE      Have to close before
  508.          JSR   DESTROY    destroying.
  509.          JSR   PRINT
  510.          DC    C'Not enough room on that volume for'
  511.          DC    C' the object file.',H'00'
  512.          LDA   SEGMENTS   Are we working on a mult-seg
  513.          BEQ   VOLFULDN   file? If so, have TRY_AGN go
  514.          POKE  SRC_OBJ,0  back to re-open source file.
  515. VOLFULDN JMP   TRY_AGN
  516.  
  517. OTHR_ERR ANOP
  518.          JSR   PRINT      Errors not covered elsewhere
  519. *                         are caught here.
  520.          DC    H'8D',C' ProDOS MLI error #$',H'00'
  521.          LDA   STORE
  522.          JSR   PRBYTE
  523.          JSR   CROUT      Print a return
  524.          JMP   BAILOUT
  525.  
  526. *-------------------------------
  527. *      Try again or quit?
  528. *-------------------------------
  529. TRY_AGN  JSR   PRINT
  530.          DC    H'8D',C' Press <return> to try again,'
  531.          DC    C' <esc> to quit. ',H'00'
  532. TRY_GET  JSR   KEYPRESS
  533.          CMP   #$8D
  534.          BEQ   DO_TRY
  535.          CMP   #ESC       <esc>?
  536.          BNE   TRY_GET
  537.          JMP   STRTPRMT   Go to 'RUN STARTUP?' prompt
  538. DO_TRY   JSR   UP
  539.          LDA   SRC_OBJ    <return>, try again
  540.          CMP   #'O'       coming from GET_OBJ?
  541.          BEQ   BAK2OBJ    If so, go back to GET_SRC2
  542.          LDA   SEGMENTS   If not, and error inturpted
  543.          BEQ   BAK2SRC    multi-seg read, go to INIT.
  544.          JMP   INIT
  545. BAK2SRC  JSR   UP         If not in a multi-seg read,
  546.          JSR   UP         leave screen in case CAT
  547.          JMP   GET_SRC2   done.
  548. BAK2OBJ  POKE  ERROR,1    Set flag for screen clear
  549.          JMP   GET_OBJ 
  550.  
  551. *----------------------------------
  552. * Disaster or normal end; bail out
  553. *----------------------------------
  554. BAILOUT  JSR   CLR_BTM
  555.          JSR   CLOSE
  556.          LDA   #$8D
  557.          JSR   COUT
  558.          CLC              Clear carry for Applesoft
  559.          JMP   $3D0       Enter Basic
  560.  
  561. *-------------------------------
  562. *         Close File(s)
  563. *-------------------------------
  564. CLOSE    JSR   MLI
  565.          DC    H'CC'      Code for close
  566.          DC    A'CLOSE_PL'
  567. *                         Note: no allowance for MLI
  568.          RTS              error; could cause inf. loop.
  569.  
  570. ********************************
  571. *             BEGIN
  572. ********************************
  573. *-------------------------------
  574. *    Some light housekeeping
  575. *-------------------------------
  576. BEGIN    ANOP
  577.          LDA   #1         Do a get_prefix to see if
  578.          STA   PARMLST    ProDOS has a prefix.
  579.          LDA   HIMEM
  580.          STA   PARMLST+1  Have get_prefix write prfix
  581.          LDA   HIMEM+1    into I.O. buffer.
  582.          STA   PARMLST+2
  583.  
  584.          JSR   MLI
  585.          DC    H'C7'      Code for get_prefix
  586.          DC    A'PARMLST'
  587.          BEQ   GP_OK      No error
  588.          JMP   OTHR_ERR
  589.  
  590. GP_OK    LDY   #0
  591.          LDA   (HIMEM),Y  Get length byte of the prfix
  592.          BNE   GOTPRFX    If not 0, ProDOS has a prfix
  593.          LDA   $BE3C      Active disk slot number
  594.          ORA   #'0'       Convert to ASCII
  595.          STA   PREFX+8    Put into prefix string
  596.          LDA   $BE3D      Active disk drive number
  597.          ORA   #'0'       To ASCII
  598.          STA   PREFX+11   Into string
  599.          LDX   #0
  600. READPRFX LDA   PREFX,X    Execute a "prefix,s#,d#" to
  601.          STA   INBUF,X    tell ProDOS the prefix
  602.          INX
  603.          CPX   #13
  604.          BNE   READPRFX
  605.          JSR   DOSCMD
  606.          BCC   GOTPRFX    No error
  607.          JMP   $BE0C      Basic.System error handler
  608. GOTPRFX  ANOP
  609.  
  610.          JSR   SCRTCH     In case any BASIC program,
  611. *                         zonk it out.
  612.          JSR   CLOSE      In case anything open, close
  613.  
  614. *===============================
  615. *   Calculate main buffer size
  616. *===============================
  617.          SEC
  618.          LDA   HIMEM
  619.          STA   OPEN_PL+3
  620.          SBC   #2
  621.          STA   BUF_END
  622.          LDA   HIMEM+1
  623.          STA   OPEN_PL+4
  624.          SBC   #0
  625.          STA   BUF_END+1
  626.  
  627.          SEC
  628.          LDA   BUF_END
  629.          SBC   #<MAINBUF
  630.          STA   READ_PL+4  Put amount of free room
  631.          LDA   BUF_END+1  into READ Parm list,
  632.          SBC   #>MAINBUF  HIMEM into OPEN Parm list.
  633.          STA   READ_PL+5
  634.  
  635. *===============================
  636. *   Init. and display screens
  637. *===============================
  638.          LDX   #0
  639. INP_PR3  LDA   PR3,X     Read 'PR#3' into buffer
  640.          STA   INBUF,X
  641.          INX
  642.          CPX   #5
  643.          BNE   INP_PR3
  644.          JSR   DOSCMD     Call Basic.System interpreter
  645.          BCC   INIT
  646.  
  647.          JSR   PRINT      If error . . .
  648.          DC    H'8D'
  649.          DC    C'REQUIRES 80 COLUMN DISPLAY',H'8D 00'
  650.          CLC
  651.          RTS              . . . and exit
  652.  
  653. INIT     ANOP
  654.          JSR   CLOSE
  655.          LDA   #0
  656.          STA   MR_AHED
  657.          STA   ERROR
  658.          STA   YES_SWAP
  659.          STA   NO_SWAPS
  660.          STA   SEGMENTS
  661.          LDA   64435
  662.          CMP   #6
  663.          BEQ   NOTIIPLS
  664.          POKE  IIPLS,$FF
  665. NOTIIPLS ANOP
  666.  
  667. DISPLAY  LDA   #' '
  668.          JSR   COUT       Activate 80 col. firmware
  669.          JSR   HOME
  670.          POKE  CATFLG,0
  671.  
  672. *-------------------------------
  673. *              Box
  674. *-------------------------------
  675.          BIT   IIPLS      If II+ or un-enhanced IIe,
  676.          BMI   NO_BOX     don't print MouseText box.
  677.          LDA   $FBC0
  678.          CMP   #$EA
  679.          BEQ   NO_BOX
  680.          LDA   #$1B
  681.          JSR   COUT       MouseText on
  682.          VTAB  3
  683.          TAB80 20
  684.          LDX   #39
  685. TOP      LDA   #$4C       MouseText top line
  686.          JSR   COUT
  687.          DEX
  688.          BPL   TOP
  689.          LDX   #6
  690. SIDES    TAB80 20
  691.          LDA   #$5A       Left side
  692.          JSR   COUT
  693.          TAB80 60
  694.          LDA   #$5F       Right side
  695.          JSR   COUT
  696.          JSR   CROUT
  697.          DEX
  698.          BPL   SIDES
  699.          LDA   #$18
  700.          JSR   COUT1      MouseText off
  701.          VTAB  9
  702.          TAB80 21
  703.          LDX   #38
  704. BTTM     LDA   #'_'       Bottom line
  705.          JSR   COUT
  706.          DEX
  707.          BPL   BTTM
  708. NO_BOX   ANOP
  709. *-------------------------------
  710. *            Title
  711. *-------------------------------
  712.          VTAB  4
  713.          TAB80 35
  714.          JSR   PRINT
  715.          DC    C'Compressor',H'00'
  716.          VTAB  6
  717.          TAB80 33
  718.          JSR   PRINT
  719.          DC    C'By Karl Bunker',H'00'
  720.          VTAB  8
  721.          TAB80 26
  722.          JSR   PRINT
  723.          DC    C'This program is Public Domain.',H'00'
  724.  
  725. *-------------------------------
  726. *      Get source pathname
  727. *-------------------------------
  728. GET_SRC  ANOP
  729.          VTAB  13
  730. GET_SRC2 JSR   CLR_BTM    To clear error mssg., etc.
  731.          LDA   #0
  732.          STA   SRC_OBJ
  733.          STA   SEGMENTS
  734.          JSR   PRINT
  735.          DC    H'8D 8D'
  736.          DC    C' Enter "?" for info. on this program'
  737.          DC    H'8D',C' Enter "C" to catalog',H'00'
  738.          JSR   UP
  739.          JSR   UP
  740.          TAB80 1
  741.          JSR   PRINT
  742.          DC    C'Pathname of your source file: ',H'00'
  743. DISPSUB  NOP              An RTS may be inserted here
  744.          LDA   #'.'
  745.          STA   INP_MINC
  746.          JSR   INPUT
  747.          CMP   #ESC
  748.          BEQ   TO_QUIT
  749.          JSR   CLR_BTM    Erase "enter '?'  - "
  750.          CPX   #1
  751.          BNE   TO_LOAD
  752.          LDA   INP_BUF+1
  753.          CMP   #'?'
  754.          BEQ   TO_INFO
  755.          CMP   #'C'
  756.          BEQ   CAT
  757. TO_LOAD  JMP   LOAD_SRC   Go load source file
  758. TO_INFO  JMP   INFO
  759. TO_QUIT  JMP   STRTPRMT   Go to 'STARTUP' prompt
  760. TO_DISP  JMP   DISPLAY    Used by CAT below
  761.  
  762. *-------------------------------
  763. *            Catalog
  764. *-------------------------------
  765. CAT      POKE  CATFLG,1   Set cat flag; screen cleared
  766.          JSR   HOME
  767.          VTAB  5
  768.          JSR   PRINT
  769.          DC    C' Enter pathname of directory to catalog: '
  770.          DC    H'00'
  771.          LDA   #','
  772.          STA   INP_MINC
  773.          JSR   INPUT
  774.          CMP   #ESC
  775.          BEQ   TO_DISP
  776.  
  777.          INX
  778.          LDA   #$8D
  779.          STA   INP_BUF,X
  780.          TXA
  781.          CLC
  782.          ADC   #7         Add shift of 7 to Y for
  783.          TAY              "CATALOG"
  784. CAT_SHFT LDA   INP_BUF,X
  785.          STA   INBUF,Y
  786.          DEY
  787.          DEX
  788.          BNE   CAT_SHFT
  789.  
  790. INPCAT   LDA   CTLG,X     Read 'catalog' into buffer
  791.          STA   INBUF,X
  792.          INX
  793.          CPX   #8
  794.          BNE   INPCAT
  795.          JSR   DOSCMD     Call Basic.System interpreter
  796.          BCC   CATDONE
  797.          JSR   $BE0C      Basic.System error handler
  798.          JSR   PRINT
  799.          DC    H'8D'
  800.          DC    C'Press <return> to try again; '
  801.          DC    C'<esc> to quit. ',H'00'
  802. CAT_GET  JSR   KEYPRESS
  803.          CMP   #$8D
  804.          BEQ   CATAGN
  805.          CMP   #ESC       <esc>?
  806.          BNE   CAT_GET
  807.          JMP   STRTPRMT   Go to 'STARTUP' prompt
  808.  
  809. CATAGN   JMP   CAT
  810. CATDONE  JSR   UP
  811.          JMP   GET_SRC2
  812. *-------------------------------
  813. *           Info text
  814. *-------------------------------
  815. INFO     ANOP
  816.          TAB80 1
  817.          VTAB  10         In case screen messed up by
  818.          JSR   CLR_BTM    catalog, clear some room.
  819.          JSR   PRINT
  820.          DC    H'8D'
  821.          DC    C' Compressor, version 1.13',H'8D'
  822.          DC    C' Compressor is a program which will read'
  823.          DC    C' an ASCII text or AppleWorks AWP file',H'8D'
  824.          DC    C' and convert it into a compressed-format'
  825.          DC    C' file which will be about 30% smaller',H'8D'
  826.          DC    C' than the source file. This compressed file'
  827.          DC    C' can then be viewed or printed with',H'8D'
  828.          DC    C' the utility program "Dogpaw" (version 3.0'
  829.          DC    C' or later). Compressor can also',H'8D'
  830.          DC    C' decompress its compressed files, converting'
  831.          DC    C' them to ASCII text files. Dogpaw,',H'8D'
  832.          DC    C' and full information on Compressor can'
  833.          DC    C' be found on the /Doc.Stuff/ disk. If',H'8D'
  834.          DC    C' you don''t have this disk, you can get'
  835.          DC    C' it by sending me a blank disk and',H'8D'
  836.          DC    C' return postage, or $3.00.',H'8D 8D'
  837.          DC    C' Karl Bunker, 321 S. Huntington Ave.,'
  838.          DC    C' Boston, MA 02130',H'8D8D'
  839.          DC    C' Press <return> ',H'00'
  840.          JSR   GETLN
  841.          JMP   DISPLAY
  842.  
  843. *===============================
  844. *       Load source file
  845. *===============================
  846. *---------------------------------------
  847. * If screen cleared for CAT, reprint it
  848. *---------------------------------------
  849. LOAD_SRC ANOP
  850.          LDA   CATFLG
  851.          BEQ   NOT_CLD    Screen not cleared
  852.          LDA   #$60
  853.          STA   DISPSUB    Make display a subroutine
  854.          JSR   DISPLAY
  855.          LDA   #$EA
  856.          STA   DISPSUB    Put NOP back
  857.          LDX   #1
  858. DISP_LUP LDA   INP_BUF,X  Reprint file name after
  859.          CMP   #' '       prompt.
  860.          BCC   DIS_SKIP
  861.          JSR   COUT
  862. DIS_SKIP INX
  863.          CPX   INP_BUF
  864.          BCC   DISP_LUP
  865.          BEQ   DISP_LUP
  866.          JSR   CLR_BTM
  867.          JSR   CROUT
  868. NOT_CLD  ANOP
  869.  
  870. *-------------------------------
  871. *     Get & check file info
  872. *-------------------------------
  873.          LDX   INP_BUF
  874. SAVE_SRC LDA   INP_BUF,X  Source name to SRC_NAM
  875.          STA   SRC_NAM,X
  876.          DEX
  877.          BPL   SAVE_SRC
  878.  
  879.          JSR   G_F_I      Go Get_File_Info
  880.          BEQ   TYPE_ERR   No ProDOS error; check type
  881.          JMP   ERR_HAND   Handle ProDOS errors
  882.  
  883. TYPE_ERR LDA   PARMLST+4
  884.          CMP   #4         Text file?
  885.          BEQ   FILE_OK
  886.          CMP   #$1A       AWP file?
  887.          BEQ   FILE_OK
  888.          CMP   #$F8       Compressed file?
  889.          BEQ   FILE_OK
  890.          SEC
  891.          SBC   #$AC
  892.          CMP   #4         SRC file?
  893.          BEQ   FILE_OK
  894.          JSR   PRINT
  895.          DC    C' File isn''t TXT, AWP or compressed type.',H'00'
  896.          JMP   TRY_AGN
  897.  
  898. FILE_OK  STA   FILE_TYP
  899.          JSR   PRNT_TYP   Print file type & size
  900.  
  901. *-------------------------------
  902. *       Open & read file
  903. *-------------------------------
  904. OPNFIL   JSR   OPEN_SRC
  905.  
  906.          BEQ   OPEN_OK    No error
  907.          JMP   ERR_HAND   MLI problem
  908.  
  909. OPEN_OK  LDA   FILE_TYP   If file is an AWP, go do a
  910.          CMP   #AWP       set mark.
  911.          BNE   GO_READ
  912.          JSR   AWP_SET
  913. GO_READ  JSR   RD_FILE
  914.  
  915. *-------------------------------
  916. *      Get object pathname
  917. *-------------------------------
  918. GET_OBJ1 ANOP
  919.          LDA   INP_BUF    Save length byte of source
  920.          STA   STORE      file name.
  921.          LDA   #'O'
  922.          STA   SRC_OBJ    Set flag for error handler
  923.          VTAB  17
  924.          JSR   CROUT
  925.  
  926.          LDA   FILE_TYP
  927.          CMP   #COM
  928.          BNE   NOT_COM
  929.  
  930.          LDX   STORE      If source file is compressed
  931.          LDA   INP_BUF,X  Length byte of source to X
  932.          CMP   #'C'       See if last 2 char.s are ".C"
  933.          BNE   GET_OBJ 
  934.          LDA   INP_BUF-1,X  If not, don't print prompt
  935.          CMP   #'.'         for default.
  936.          BNE   GET_OBJ 
  937.          DEX
  938.          DEX
  939.          STX   INP_BUF    If so, take 2 from length
  940.          STX   STORE      of pathname to delete ".C"
  941.          BNE   DEF_PRMT   (always)
  942.  
  943. NOT_COM  LDX   STORE      Default pathname for
  944.          INX              compressed files; add ".C".
  945.          INX
  946.          STX   INP_BUF
  947.          STX   STORE
  948.          LDA   #'.'
  949.          STA   INP_BUF-1,X
  950.          LDA   #'C'
  951.          STA   INP_BUF,X
  952.  
  953. DEF_PRMT LDX   #0         Print default file name
  954.          TAB80 27         and prompt.
  955. DIS_LUP2 LDA   INP_BUF+1,X
  956.          JSR   COUT
  957.          INX
  958.          CPX   INP_BUF
  959.          BCC   DIS_LUP2
  960.          JSR   PRINT
  961.          DC    H'8D',C' <Return> to accept',H'00'
  962.  
  963. GET_OBJ  VTAB  18
  964.          TAB80 1
  965. OBJ_PRMT JSR   PRINT
  966.          DC    C'Pathname for object file: ',H'00'
  967.          LDA   ERROR      If error in name, erase it
  968.          BEQ   OBJ_INP
  969.          JSR   CLR_BTM
  970.          POKE  ERROR,0
  971.          BEQ   GET_OBJ
  972. OBJ_INP  LDA   #'.'
  973.          STA   INP_MINC
  974.          JSR   INPUT
  975.          CMP   #ESC
  976.          BEQ   TO_INIT
  977.          JSR   CLR_BTM    Erase "<Return> to - "
  978.  
  979.          TXA              If name entered, use it
  980.          BNE   DES_CRE
  981.          LDA   STORE      X=0; return pressed; put
  982.          STA   INP_BUF    length byte ahead of name.
  983.          BNE   DES_CRE2   (always)
  984.  
  985. TO_INIT  JMP   INIT       Esc pressed; back to start
  986.  
  987. *-------------------------------
  988. *     Create object file
  989. *-------------------------------
  990. DES_CRE  ANOP
  991.          LDX   INP_BUF
  992. CMP_OBJ  LDA   INP_BUF,X  Compare object name with
  993.          CMP   SRC_NAM,X  source.
  994.          BNE   DES_CRE2
  995.          DEX
  996.          BPL   CMP_OBJ    If they're the same . . .
  997.          JSR   PRINT
  998.          DC    H'8D',C' Can''t use the same name'
  999.          DC    C' for the object file.',H'00'
  1000.          JMP   TRY_AGN
  1001.  
  1002. DES_CRE2 ANOP
  1003.          LDA   #0
  1004.          STA   CREAT_PL+8  Zero out time & date bytes
  1005.          STA   CREAT_PL+9
  1006.          STA   CREAT_PL+$A
  1007.          STA   CREAT_PL+$B
  1008.          LDA   #$F8       A "user defined" file type
  1009.          CMP   FILE_TYP   If source file is com-
  1010.          BNE   SET_TYPE   pressed, make object text.
  1011.          LDA   #$04
  1012. SET_TYPE STA   CREAT_PL+4
  1013.  
  1014.          JSR   MLI
  1015.          DC    H'C0'      Code for Create
  1016.          DC    A'CREAT_PL'
  1017.  
  1018.          BEQ   OBJ_REDY   No error
  1019.          CMP   #$47       File with that name exists?
  1020.          BEQ   DES_PRMT
  1021.          JMP   ERR_HAND
  1022.  
  1023. DES_PRMT JSR   PRINT
  1024.          DC    H'8D',C' A file with that name '
  1025.          DC    C'already exists; o.k. to overwrite'
  1026.          DC    C' it? Y/N  Y',H'08 00'
  1027.          JSR   KEYPRESS
  1028.          CMP   #$8D       Return = Yes
  1029.          BEQ   KILLIT
  1030.          AND   #$DF
  1031.          CMP   #'Y'
  1032.          BNE   TO_GTOBJ   Not o.k. to destroy
  1033. KILLIT   JSR   UP
  1034.          JSR   CLR_BTM    Erase prompt
  1035.          JSR   UNL_DES    Unlock & destroy file
  1036.          JMP   DES_CRE2
  1037.  
  1038. TO_GTOBJ POKE  ERROR,1    Set flag to clear screen
  1039.          JMP   GET_OBJ 
  1040.  
  1041. *-------------------------------
  1042. *   Open object file; check if
  1043. *  compressing or decompressing
  1044. *-------------------------------
  1045. OBJ_REDY ANOP
  1046.          JSR   OPEN_OBJ   Go open object file
  1047.          BEQ   OPOBJ_OK   No error
  1048.          JMP   ERR_HAND
  1049.  
  1050. OPOBJ_OK ANOP
  1051.          LDA   FILE_TYP   If compressed file, go to
  1052.          CMP   #COM       decompress routine.
  1053.          BNE   COMP_TXT
  1054.          JMP   DECOMP
  1055.  
  1056. ********************************
  1057. *   Main program; Compression
  1058. ********************************
  1059. COMP_TXT ANOP
  1060.          LDA   #0
  1061.          STA   LETR_NUM
  1062.          TAX
  1063.          TAY
  1064.  
  1065.          JSR   GET_CHAR   Get first character
  1066.          JSR   CODABL     See if it's codable
  1067.          CMP   #32        Has it been converted?
  1068.          BCS   MAIN_LUP
  1069.          LDA   #0         If so, the first byte into
  1070.          STA   OBJ_BUF,X  the object file is a 0.
  1071.          INX
  1072.  
  1073. MAIN_LUP ANOP
  1074.          POKE  FROM_ML,$FF  Flag: coming from MAIN_LUP
  1075.          JSR   GET_CHAR
  1076.          JSR   CODABL
  1077.          CMP   #32        Has it been converted?
  1078.          BCS   UN_CODED
  1079.          INC   LETR_NUM   Char. codable; inc. counter
  1080.          STA   STOREC
  1081.          LDA   LETR_NUM   Working on letter 1, 2 or 3?
  1082.          CMP   #2
  1083.          PHP
  1084.          POKE  FROM_ML,0
  1085.          LDA   STOREC     Byte back to A for wrk below
  1086.          PLP
  1087.          BCC   LETR_1
  1088.          BEQ   LETR_2
  1089.          BCS   LETR_3
  1090.  
  1091. LETR_1   ASL   A          Shift byte 3 bits left
  1092.          ASL   A
  1093.          ASL   A
  1094.          STA   WRK_BYT1
  1095.          JSR   INC_PTR
  1096.          BNE   MAIN_LUP
  1097. LETR_2   LSR   A          Shift 2 bits right to store
  1098.          LSR   A          3 high bits in WRK_BYT1.
  1099.          ORA   WRK_BYT1
  1100.          JSR   NXT_OBJ
  1101.          LDA   STOREC     Get byte again;
  1102.          ASL   A          shift 6 bits to left to
  1103.          ASL   A          store 2 low bits in
  1104.          ASL   A          WRK_BYT2.
  1105.          ASL   A
  1106.          ASL   A
  1107.          ASL   A
  1108.          STA   WRK_BYT2
  1109.          JSR   INC_PTR
  1110.          BNE   MAIN_LUP
  1111. LETR_3   ASL   A          1 bit to left
  1112.          ORA   WRK_BYT2
  1113.          STA   WRK_BYT2
  1114.          JSR   INC_PTR
  1115.          JSR   GET_CHAR
  1116.          JSR   CODABL
  1117.          CMP   #32        Converted?
  1118.          BCS   LTR3_DN    If not, leave bit 0 clear
  1119.          LDA   #1         If next char is codable, set
  1120.          ORA   WRK_BYT2   bit 0 of WRK_BYT2
  1121.          STA   WRK_BYT2
  1122. LTR3_DN  LDA   WRK_BYT2
  1123.          JSR   NXT_OBJ
  1124.          LDA   #0
  1125.          STA   LETR_NUM   Reset LETR_NUM
  1126.          STA   WRK_BYT1   0 out working bytes in case
  1127.          STA   WRK_BYT2   they're saved by UN_CODED.
  1128.          JMP   MAIN_LUP
  1129.  
  1130. UN_CODED STA   STOREC
  1131.          POKE  FROM_ML,0  Clear from-MAIN_LUP flag
  1132.          LDA   LETR_NUM   Are we in the middle of
  1133.          BEQ   UN_CDD3    coding working bytes?
  1134.          CMP   #2         Yes; WRK_BYT1 already saved?
  1135.          BEQ   UN_CDD2
  1136.          LDA   WRK_BYT1
  1137.          JSR   NXT_OBJ
  1138. UN_CDD2  LDA   WRK_BYT2
  1139.          JSR   NXT_OBJ
  1140. UN_CDD3  LDA   #%10000000
  1141.          STA   HILO_ORA
  1142.          LDA   #0
  1143.          STA   LETR_NUM   Reset LETR_NUM
  1144.          STA   WRK_BYT1   0 out working bytes in case
  1145.          STA   WRK_BYT2   they're saved by UN_CODED.
  1146.          JSR   INC_PTR    Get next character to see
  1147.          JSR   GET_CHAR   if this one should be high.
  1148.          JSR   CODABL
  1149.          CMP   #32        Converted?
  1150.          BCS   HI_ASCII   No, so current char. is high
  1151.          LDA   #0
  1152.          STA   HILO_ORA
  1153. HI_ASCII LDA   STOREC     Set hi bit if next char is
  1154.          ORA   HILO_ORA   uncodable.
  1155.          JSR   NXT_OBJ
  1156.          JMP   MAIN_LUP   Get next character
  1157.  
  1158. *=======================================
  1159. *     Subroutines for main program
  1160. *=======================================
  1161. *--------------------------------
  1162. * Get a character; skip controls
  1163. *--------------------------------
  1164. GET_CHAR LDA   (PTR),Y       Get a character
  1165.          BEQ   ZR_RCHED      If a 0, handle it
  1166.          AND   #%01111111    In case high ASCII TXT
  1167.          CMP   #13        <return>?
  1168.          BEQ   CHAR_GOT
  1169.          CMP   #32        Control character?
  1170.          BCS   CHAR_GOT
  1171.          JSR   INC_PTR
  1172.          BNE   GET_CHAR   If so, skip it; get next
  1173. CHAR_GOT RTS
  1174.  
  1175. ZR_RCHED ANOP
  1176.          LDA   MR_AHED    Is there more text?
  1177.          BNE   ZR_RCHD2   If so, go get next segment,
  1178.          BIT   FROM_ML    If not, check if we're coming
  1179.          BPL   CHAR_GOT   from MAIN_LUP. If not, return
  1180.          BMI   DATS_ALL   If so, LETR_NUM ok for exit
  1181. ZR_RCHD2 STX   STOREX
  1182.          JSR   SEG_READ
  1183.          LDX   STOREX
  1184.          JMP   GET_CHAR   and continue.
  1185.  
  1186. DATS_ALL ANOP             End reached; we're outa here
  1187.          PLA              Pop stack,
  1188.          PLA
  1189.          LDA   LETR_NUM   and save any bytes
  1190.          BEQ   DATS_AL3   we're already coding.
  1191.          CMP   #2         WRK_BYT1 already saved?
  1192.          BEQ   DATS_AL2
  1193.          LDA   WRK_BYT1
  1194.          JSR   NXT_OBJ
  1195. DATS_AL2 LDA   WRK_BYT2
  1196.          JSR   NXT_OBJ
  1197. DATS_AL3 LDA   #COM
  1198.          STA   FILE_TYP   Reset file type for PRNT_TYP
  1199.          JMP   DONE
  1200.  
  1201. *-------------------------------
  1202. *  See if character is codable
  1203. *-------------------------------
  1204. CODABL   ANOP
  1205.          MSB   OFF
  1206.          CMP   #'a'       Less than 'a'? if so, check
  1207.          BCC   EXTRAS     for the other codable chars.
  1208.          CMP   #'{'
  1209.          BCS   NOT_CDBL   Greater than z; not codable
  1210.          SEC              Lower case character;
  1211.          SBC   #96        convert it to 1 to 26 and
  1212.          RTS              return.
  1213. EXTRAS   ANOP
  1214.          PHA
  1215.          LDA   #27        Set ex_code to 27 for space
  1216.          STA   EX_CODE
  1217.          PLA
  1218.          CMP   #' '
  1219.          BEQ   EX_FOUND
  1220.          INC   EX_CODE    Inc ex_code to 28 for comma
  1221.          CMP   #','
  1222.          BEQ   EX_FOUND
  1223.          INC   EX_CODE    To 29 for apostrophe
  1224.          CMP   #39        (apostrophe)
  1225.          BEQ   EX_FOUND
  1226.          INC   EX_CODE    To 30 for period
  1227.          CMP   #'.'
  1228.          BEQ   EX_FOUND
  1229.          INC   EX_CODE    To 31 for <return>
  1230.          CMP   #13
  1231.          BNE   NOT_CDBL
  1232. EX_FOUND LDA   EX_CODE
  1233. NOT_CDBL RTS
  1234.          MSB   ON
  1235.  
  1236. *-------------------------------
  1237. *  Put byte into object buffer;
  1238. *     Write to file if full
  1239. *-------------------------------
  1240. NXT_OBJ  STA   OBJ_BUF,X
  1241.          INX
  1242.          BEQ   WRT_OBJ    If buffer full, write it to
  1243.          RTS              object file; else return.
  1244.  
  1245. WRT_OBJ  ANOP
  1246.          LDA   #0         Set default request_count
  1247.          STA   WRIT_PL+4  to #$100
  1248.          LDA   #1
  1249.          STA   WRIT_PL+5
  1250.          TXA
  1251.          BEQ   DO_WRT     If X=0, leave default. Else,
  1252.          STX   WRIT_PL+4  X holds low byte of request
  1253.          LDA   #0         count; high byte is 0.
  1254.          STA   WRIT_PL+5
  1255. DO_WRT   JSR   MLI
  1256.          DC    H'CB'      Code for write
  1257.          DC    A'WRIT_PL'
  1258.  
  1259.          BEQ   WRTOBJDN   No error
  1260.          JMP   ERR_HAND
  1261.  
  1262. WRTOBJDN LDX   #0
  1263.          RTS
  1264.  
  1265. *-------------------------------
  1266. *       "Done" message
  1267. *-------------------------------
  1268. DONE     ANOP             Write remainder of object
  1269.          TXA              buffer into file, unless
  1270.          BEQ   DONE2      it's empty (X=0).
  1271.          JSR   WRT_OBJ
  1272. DONE2    JSR   CLOSE      Close both files
  1273.          JSR   G_F_I      Get and print file type,
  1274.          VTAB  18
  1275.          JSR   CROUT
  1276.          JSR   PRNT_TYP   size.
  1277.          JSR   PRINT
  1278.          DC    H'8D 8D',C' Done!',H'8D'
  1279.          DC    C' Press <return> to process another'
  1280.          DC    C' file, <esc> to quit. ',H'00'
  1281. AGN_GET  JSR   KEYPRESS
  1282.          CMP   #$8D
  1283.          BNE   AGN_GET2
  1284.          JMP   INIT       <return>; get new file names
  1285. AGN_GET2 CMP   #ESC       <esc>?
  1286.          BNE   AGN_GET
  1287.          JSR   UP         <esc> pressed;
  1288. STRTPRMT JSR   CLR_BTM    erase this prompt
  1289.          JSR   PRINT
  1290.          DC    H'8D',C' Run STARTUP program? Y/N  Y'
  1291.          DC    H'08 00'
  1292.          JSR   KEYPRESS
  1293.          CMP   #$8D       Return = Yes
  1294.          BEQ   DO_STRT
  1295.          AND   #$DF
  1296.          CMP   #'Y'
  1297.          BNE   QUIT
  1298.  
  1299. DO_STRT  POKE  STORE,0
  1300. DO_STRT2 LDX   #8
  1301. START_LP LDA   STARTUP,X
  1302.          STA   INBUF,X
  1303.          DEX
  1304.          BPL   START_LP
  1305.          JSR   DOSCMD
  1306.  
  1307.          LDA   STORE      Check & set flag to avoid
  1308.          BNE   QUIT       inf. loop.
  1309.          POKE  STORE,1
  1310.          LDX   #7         Won't return from RUN DOSCMD
  1311. PRFX_LP  LDA   PRFX,X     unless it couldn't find the
  1312.          STA   INBUF,X    default prefix (or STARTUP).
  1313.          DEX              If this happens, clear
  1314.          BPL   PRFX_LP    prefix & try again.
  1315.          JSR   DOSCMD
  1316.          JMP   DO_STRT2
  1317.  
  1318. QUIT     TAB80 1          <esc> pressed;
  1319.          JSR   CLR_BTM    erase this prompt
  1320.          JMP   BAILOUT    and quit.
  1321.  
  1322. *=======================================
  1323. *    AWP file conversion subroutines
  1324. *=======================================
  1325. *---------------------------------------
  1326. * Execute a Set_Mark to skip data bytes
  1327. *---------------------------------------
  1328. AWP_SET  ANOP
  1329.          LDA   #0         Skip over 300 data bytes
  1330.          STA   MARK_PL+4
  1331.          LDA   #$01
  1332.          STA   MARK_PL+3
  1333.          LDA   #$2C
  1334.          STA   MARK_PL+2  Position of $00 01 2C (300)
  1335.          JMP   SET_MARK
  1336. *=======================================
  1337. *      Main AWP conversion routine
  1338. *=======================================
  1339. AWP_CON  ANOP
  1340.  
  1341.          LDA   #<MAINBUF  Init pointers
  1342.          STA   PTR
  1343.          STA   AUX_PTR
  1344.          LDA   #>MAINBUF
  1345.          STA   AUX_PTR+1
  1346.          STA   PTR+1
  1347.  
  1348. SCAN_AWP ANOP
  1349.          LDY   #1         Get byte +001
  1350.          LDA   (AUX_PTR),Y
  1351.          BEQ   TXT_LINE   If a 0, it's a text record
  1352.          CMP   #$D0       A <return> line?
  1353.          BNE   AWPENDMK
  1354.          JSR   EMB_RET    If so, go put it in,
  1355.          JSR   AWP_NXTL
  1356.          BNE   SCAN_AWP   continue.
  1357. AWPENDMK CMP   #$FF       End of file marker?
  1358.          BEQ   END_AWP    Exit if so
  1359.          JSR   AWP_NXTL   Continue if not
  1360.          BNE   SCAN_AWP
  1361.  
  1362. TXT_LINE ANOP
  1363.          LDY   #2           Get byte +002
  1364.          LDA   (AUX_PTR),Y
  1365.          CMP   #$FF         Is this a tab-ruler line?
  1366.          BNE   TXT_LIN1
  1367.          LDY   #0           If so, skip over the line:
  1368.          CLC
  1369.          LDA   (AUX_PTR),Y  Get byte +000 (length byte)
  1370.          ADC   #2           add 2,
  1371.          CLC
  1372.          ADC   AUX_PTR      add this to pointers,
  1373.          STA   AUX_PTR
  1374.          LDA   AUX_PTR+1
  1375.          ADC   #0
  1376.          STA   AUX_PTR+1
  1377.          BNE   SCAN_AWP     continue with next line.
  1378.  
  1379. TXT_LIN1 INY                Get byte +003
  1380.          LDA   (AUX_PTR),Y  If high bit set, line ends
  1381.          PHP                with <ret>; save N flag
  1382.          AND   #$7F       Clearing high bit gives
  1383.          STA   AWP_LEN    length byte; save it.
  1384.          JSR   AWP_RDLN   Go read line into buffer.
  1385.          POKE  AWP_RET,0  Clear line-end-<ret> flag
  1386.          PLP              Get back N flag,
  1387.          BPL   TXT_LINQ
  1388.          JSR   EMB_RET    embed return if needed,
  1389. TXT_LINQ JMP   SCAN_AWP   Continue scan
  1390.  
  1391. *----------------------------
  1392. *   End of AWP file found
  1393. *----------------------------
  1394. END_AWP  ANOP
  1395.          LDY   #0         Put in end-of-file marker
  1396.          TYA
  1397.          STA   (PTR),Y
  1398.          LDA   #<MAINBUF  Reset pointers
  1399.          STA   PTR
  1400.          LDA   #>MAINBUF
  1401.          STA   PTR+1
  1402.          RTS              Return
  1403.  
  1404. *=================================
  1405. *  Subroutines for AWP conversion
  1406. *=================================
  1407. *---------------------------------------
  1408. * Move line from AWP buf. to ASCII buf.
  1409. *---------------------------------------
  1410. AWP_RDLN ANOP
  1411.          CLC
  1412.          LDA   AUX_PTR
  1413.          ADC   #4            Text starts at byte +004
  1414.          STA   AUX_PTR
  1415.          LDA   AUX_PTR+1
  1416.          ADC   #0
  1417.          STA   AUX_PTR+1
  1418.          LDY   #0
  1419.          LDA   (AUX_PTR),Y
  1420.          CMP   #$16       Does line start with a tab?
  1421.          BNE   AWP_RL1
  1422.          LDA   AWP_RET    If so, make sure previous
  1423.          BNE   AWP_RL1    line ends with a <ret>.
  1424.          JSR   EMB_RET
  1425. AWP_RL1  LDA   (AUX_PTR),Y   Get a byte from AWP
  1426.          CMP   #$0B          If sticky-space,
  1427.          BEQ   AWP_MKSP
  1428.          CMP   #$17          or tab-space,
  1429.          BNE   PUT_AWP
  1430. AWP_MKSP LDA   #$20          convert to ASCII space.
  1431. PUT_AWP  CMP   #$20          Unless it's another
  1432.          BCC   AWP_NXTC      special code,
  1433.          STA   (PTR),Y       put it into ASCII buffer.
  1434.          JSR   INC_PTR
  1435. AWP_NXTC JSR   INC_APTR
  1436.          DEC   AWP_LEN    Dec length byte
  1437.          BNE   AWP_RL1    until whole line moved.
  1438.  
  1439. *---------------------------------------
  1440. * If necessary, clip off end of AWP file
  1441. *---------------------------------------
  1442.          LDA   MR_AHED    Is there more to this file
  1443.          BEQ   AWP_RLQ    than this buffer-full?
  1444.          CLC
  1445.          LDA   AUX_PTR+1  If so, are we within
  1446.          ADC   #1         $100 of buffer-end?
  1447.          CMP   BUF_END+1
  1448.          BCC   AWP_RLQ
  1449.          LDY   #1           If so, make the next line
  1450.          LDA   #$FF         a dummy EOF cmd. line.
  1451.          STA   (AUX_PTR),Y
  1452.  
  1453.          SEC
  1454.          LDA   BUF_END      Get & store the difference
  1455.          SBC   AUX_PTR      between our new end-of-
  1456.          STA   STORE_AC     buffer-full and the actual
  1457.          LDA   BUF_END+1    end of buffer.
  1458.          SBC   AUX_PTR+1
  1459.          STA   STORE_AC+1
  1460.          SEC
  1461.          LDA   SRC_MARK     Subtract this from the
  1462.          SBC   STORE_AC     saved source-mark.
  1463.          STA   SRC_MARK
  1464.          LDA   SRC_MARK+1
  1465.          SBC   STORE_AC+1
  1466.          STA   SRC_MARK+1
  1467.          LDA   SRC_MARK+2
  1468.          SBC   #0
  1469.          STA   SRC_MARK+2
  1470.  
  1471. AWP_RLQ  RTS                Continue with next line
  1472.  
  1473. *-------------------------------
  1474. * skip over cmd. or <ret> line
  1475. *-------------------------------
  1476. AWP_NXTL JSR   INC_APTR
  1477.          JMP   INC_APTR
  1478. *-------------------------------
  1479. *  AWP embedded return handler
  1480. *-------------------------------
  1481. EMB_RET  LDY   #0
  1482.          LDA   #$0D       ASCII return
  1483.          STA   AWP_RET    Clear line-end-<ret> flag
  1484.          STA   (PTR),Y    Into ASCII formated buffer
  1485.          JMP   INC_PTR    Inc pointers, return.
  1486.  
  1487.  
  1488. ********************************
  1489. *  Decompress compressed file
  1490. ********************************
  1491. DECOMP   ANOP
  1492.          LDX   #0         Init X & Y; pointers are
  1493.          LDY   #0         already set.
  1494.          JSR   INC_COM3   Dec. bytes-used counter
  1495.          LDA   (PTR),Y    Get first byte
  1496.          BNE   UNCODED2   If not 0, it's uncoded ASCII
  1497.  
  1498. DECD_LUP ANOP
  1499. LETER_1  JSR   INC_COM
  1500.          LDA   (PTR),Y
  1501.          LSR   A
  1502.          LSR   A
  1503.          LSR   A
  1504.          JSR   PUT_LTER
  1505.  
  1506. LETER_2  LDA   (PTR),Y
  1507.          AND   #%00000111
  1508.          ASL   A
  1509.          ASL   A
  1510.          STA   STOREC
  1511.          JSR   INC_COM
  1512.          LDA   (PTR),Y
  1513.          LSR   A
  1514.          LSR   A
  1515.          LSR   A
  1516.          LSR   A
  1517.          LSR   A
  1518.          LSR   A
  1519.          ORA   STOREC
  1520.          JSR   PUT_LTER
  1521.  
  1522. LETER_3  LDA   (PTR),Y
  1523.          AND   #%00111111
  1524.          LSR   A
  1525.          JSR   PUT_LTER
  1526.          LDA   (PTR),Y
  1527.          AND   #%00000001
  1528.          BNE   DECD_LUP   If bit 0 clear, next byte
  1529. *                         is uncoded; fall through.
  1530.  
  1531. UNCODED  ANOP
  1532.          JSR   INC_COM
  1533. UNCODED2 LDA   (PTR),Y    Get character (uncoded)
  1534.          AND   #%01111111 Clear high bit
  1535.          JSR   NXT_OBJ    Put into object buffer
  1536.          LDA   (PTR),Y    Hi bit set on uncoded byte?
  1537.          BMI   UNCODED    If so, next is uncoded too
  1538.          JMP   DECD_LUP
  1539.  
  1540. *-------------------------------
  1541. *   Inc. compressed pointers;
  1542. *   check if file end reached
  1543. *-------------------------------
  1544. INC_COM  ANOP
  1545.          LDA   READ_IN    Check if buffer used up
  1546.          ORA   READ_IN+1
  1547.          BNE   INC_COM2   If both = 0 buffer used up.
  1548.          LDA   MR_AHED    Anything left in file?
  1549.          BEQ   COM_END    No
  1550.          JSR   SEG_READ   Yes; get another buffer-full
  1551.          JMP   INC_COM3   Don't inc ptr's after read
  1552. INC_COM2 JSR   INC_PTR    Inc loading buffer's ptr's
  1553. INC_COM3 LDA   READ_IN    Dec amount read in as counter
  1554.          BNE   DEC_RIL    If low byte=0, dec high
  1555.          DEC   READ_IN+1  byte first.
  1556. DEC_RIL  DEC   READ_IN
  1557.          RTS
  1558.  
  1559. COM_END  ANOP
  1560.          PLA              Pop stack
  1561.          PLA
  1562.          LDA   #TXT
  1563.          STA   FILE_TYP   Reset file type for PRNT_TYP
  1564.          JMP   DONE       Go to main Compressor's DONE
  1565.  
  1566. *-----------------------------------------
  1567. * Finish decoding character, put in buffer
  1568. *-----------------------------------------
  1569. PUT_LTER ANOP
  1570.          BNE   PUT_LTR2   If it's a 0, just return
  1571.          RTS
  1572. PUT_LTR2 CMP   #27        One of the extra characters?
  1573.          BCC   NOT_EXT
  1574.          SEC              If so, get char out of table
  1575.          SBC   #27
  1576.          TAY
  1577.          LDA   EXT_LET,Y
  1578.          LDY   #0         Reset Y,
  1579.          JMP   NXT_OBJ    and put char. into buffer.
  1580. NOT_EXT  CLC
  1581.          ADC   #96        Decode to low ASCII
  1582.          JMP   NXT_OBJ
  1583.  
  1584. *-------------------------------
  1585. *      MLI Parameter lists
  1586. *-------------------------------
  1587. CLOSE_PL DC    H'01'
  1588.          DC    H'00'
  1589. MARK_PL  DC    H'02'
  1590.          DC    H'01'
  1591.          DS    3
  1592. OPEN_PL  DC    H'03'
  1593.          DS    5
  1594. READ_PL  DC    H'04'
  1595.          DC    H'01'
  1596.          DC    A'MAINBUF'
  1597.          DS    4
  1598. DEST_PL  DC    H'01'
  1599.          DC    A'INP_BUF'
  1600. CREAT_PL DC    H'07'      CREATE Parm list:
  1601.          DC    A'INP_BUF'
  1602.          DC    H'C3'      Access code for "unlocked"
  1603.          DS    1          File type put here
  1604.          DC    H'0B B0'   AUX_TYPE $B00B
  1605.          DC    H'01'      STORAGE_TYPE standard
  1606.          DS    4          Time & date put here
  1607. WRIT_PL  DC    H'04'
  1608.          DC    H'01'
  1609.          DC    A'OBJ_BUF'
  1610.          DS    4
  1611. PARMLST  DS    $12        General use parm list
  1612.  
  1613. *===============================
  1614. *      Buffers, flags, etc.
  1615. *===============================
  1616. IIPLS    DS    1      Flag that on II+
  1617. MAINBUF  EQU   $2100  Buffer for source file
  1618. OBJ_BUF  EQU   $2000  1 pg. buffer for object file
  1619. BUF_END  DS    2      Gets end of buffer
  1620. STORE    DS    1      Use to store various stuff
  1621. STOREC   DS    1      Store char. in comp. & decomp
  1622. STOREX   DS    1      Use to store X register
  1623. STORE_AC DS    2      Storage for AWP_CON
  1624. AWP_LEN  DS    1      AWP line length byte
  1625. AWP_RET  DS    1      Flag: AWP line ends w/ <ret>
  1626. SRC_NAM  DS    49     Holds source name to compare
  1627. INP_BUF  DS    49     Holds input file name
  1628. READ_1   DS    1      Flag: use input for 1 key press
  1629. INP_MINC DS    1      Min. char. value in INPUT
  1630. SRC_OBJ  DS    1      Holds 'O' if in GET_OBJ
  1631. ERROR    DS    1      Error flag for screen clear
  1632. CATFLG   DS    1      Screen cleared for catalog
  1633. FILE_TYP DS    1      Gets file type
  1634. MR_AHED  DS    1      Flag that more text is ahead
  1635. EX_CODE  DS    1      Holds code of extra char.
  1636. HILO_ORA DS    1      Hold mask to set(?) hi bit
  1637. LETR_NUM DS    1      Gets 1, 2 or 3 - source char
  1638. WRK_BYT1 DS    1      Two working bytes that get
  1639. WRK_BYT2 DS    1      three encoded characters.
  1640. FROM_ML  DS    1      Flag that coming from MAIN_LUP
  1641. SEGMENTS DS    1      Flag that file is multi-seg.
  1642. NO_SWAPS DS    1      Flag that disks not swapped
  1643. YES_SWAP DS    1      Flag that disks being swapped
  1644. SRC_MARK DS    3      Holds source GET_MARK
  1645. OBJ_MARK DS    3      Holds object GET_MARK
  1646. READ_IN  DS    2      Amount read in for DECOMP
  1647. LDNG_DGT DS    1      Flag for print # of blocks
  1648.  
  1649. *===============================
  1650. *          Strings
  1651. *===============================
  1652. CTLG     DC    C'CATALOG '
  1653. PREFX    DC    C'PREFIX,S ,D ',H'8D'
  1654. PR3      DC    C'PR#3',H'8D'
  1655. STARTUP  DC    C'-STARTUP',H'8D'
  1656. PRFX     DC    C'PREFIX/',H'8D'
  1657. EXT_LET  DC    H'20 2C 27 2E 0D'    For DECOMP
  1658.  
  1659.          END
  1660.